package main

import (
	"fmt"
	"io"
	"os"
)

/*读写文件内容介绍
 */
func main() {

	/*
		一. 读取文件的步骤:
			· 打开文件
			· 读取文件。从文件中开始读取数据，返回值n是实际读取的字节数。如果读取到文件末尾，n为0或err为io.EOF
			· 关闭文件
	*/
	// 先创建一个文件
	s := "./test.txt"
	_, err := os.Create(s)
	if err != nil {
		fmt.Println("error：", err.Error())
	}

	// 读取文件
	readFile(s)

	/*
		二. 写入文件的步骤：
			· 打开或创建文件
			· 写入文件
			. 关闭文件
	*/
	// 1. 打开文件（用os.OpenFile() 设置可读）
	file, err := os.OpenFile(s, os.O_RDWR, os.ModePerm)
	if err != nil {
		fmt.Println("error：", err.Error())
	} else {
		// 2. 写入文件
		_, err := file.Write([]byte(`3434434343434
			rrererer
			erewrewrrer
			11323234
			反对反对是德国
		`))
		if err != nil {
			fmt.Println("写入文件异常：", err.Error())
		}
		_, err = file.WriteString("这是我写入的文件内容啊大师傅但是犯得上反对343434343434")
		if err != nil {
			fmt.Println("写入文件异常：", err.Error())
		}
	}
	file.Close()

	// 读取文件，看是否写入文件成功
	readFile(s)

	/*
		三. 复制文件：io.Copy()
	*/
	// 源文件路径
	srcFile := "./test.txt"
	// 目标文件
	tarFile := "./testNew.txt"
	// 打开源文件
	openFile, err := os.Open(srcFile)
	if err != nil {
		fmt.Println("error：", err.Error())
	}
	// 打开或创建源文件
	f, err := os.OpenFile(tarFile, os.O_RDWR|os.O_CREATE, os.ModePerm)
	if err != nil {
		fmt.Println("error：", err.Error())
	}
	// 延迟关闭文件，不管是否复制成功都关闭文件。
	//		TIPS： defer语句经常被用于处理成对的操作，如打开-关闭、连接-断开连接、加锁-释放锁
	defer openFile.Close()
	defer f.Close()
	_, _ = io.Copy(f, openFile)
}

func readFile(path string) {

	// 1. 打开文件
	file, err := os.Open(path)
	if err != nil {
		fmt.Println("error：", err.Error())
	} else {
		// 2. 读取文件
		// 设置切片大小
		bytes := make([]byte, 1024*8, 1024*8)
		for {
			n, err := file.Read(bytes)
			if n == 0 || err == io.EOF {
				fmt.Println("文件读取结束！")
				break
			}
			fmt.Println(string(bytes[:n]))
		}
		// 3. 关闭文件
		_ = file.Close()
	}
}
